package com.rao.quartz.service;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * @Author: raoguang
 * @Date: 2022/08/21/20:13
 * @Description:
 */

@Service
public class UploadService {

    @Value("${file.uploadFolder}")
    private String uploadFolder;

    @Value("${file.staticPath}")
    private String staticPath;

    /**
     * MultipartFile : 这个对象是springMVC提供的文件上传的接受的类
     * 他的底层自动会去和HttpServletRequest request中的request.getInputStream() 融合
     * 从而达到文件上传的效果，也就是告诉你一个道理：文件上传的底层原理是==> request.getInputStream()
     *
     * @param multipartFile
     * @param dir
     * @return
     */
    public Map<String, Object> upLoadImg(MultipartFile multipartFile, String dir) {
        try {
            //1、获取真实的文件名  比如：上传文件：aaa.jpg
            String realFileName = multipartFile.getOriginalFilename();

            //2、截取文件名的后缀  拿到.jpg后缀
            String imgSuffix = realFileName.substring(realFileName.lastIndexOf("."));

            //3、生成唯一的文件名  将aaa.jpg 改写成:  SD234432.....ms.jpg
            String newFileName = UUID.randomUUID().toString() + imgSuffix;

            //4、日期目录  日期格式： 2022/08/21
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
            String datePath = dateFormat.format(new Date());

            //5、制定文件上传的目录  生成一个最终目录：F://tmp/avatar/2022/08/21
            String serverPath = uploadFolder;
            File targetFile = new File(serverPath + dir, datePath);
            if (!targetFile.exists()) {
                targetFile.mkdirs();
            }

            //6、指定文件上传的目录  文件上传以后在服务器上最终的文件名和目录是：F://tmp/avatar/2022/08/21/SD234432.....ms.jpg
            File targetFileName = new File(targetFile, newFileName);

            //7、文件上传到指定的目录  将用户选择的aaa.jpg上传到F://tmp/avatar/2022/08/21/SD234432.....ms.jpg
            multipartFile.transferTo(targetFileName);

            String fileName = dir + "/" + datePath + "/" + newFileName;

            Map<String, Object> map = new HashMap<>();
            map.put("url", staticPath + "/images/" + fileName);
            map.put("size", multipartFile.getSize());
            map.put("ext", imgSuffix);
            map.put("filename", realFileName);
            map.put("rpath", datePath + "/" + newFileName);

            return map;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}
